home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Source / GNU / cc / fixincludes < prev    next >
Text File  |  1994-01-28  |  44KB  |  1,387 lines

  1. #! /bin/sh
  2. # Install modified versions of certain ANSI-incompatible system header files
  3. # which are fixed to work correctly with ANSI C
  4. # and placed in a directory that GNU C will search.
  5.  
  6. # See README-fixinc for more information.
  7.  
  8. # Command to run gcc.
  9. GCCCMD=${4-${GCCCMD-gcc}}
  10.  
  11. # Directory where gcc sources (and sometimes special include files) live.
  12. # fixincludes doesn't use this, but fixinc.svr4 does, and I want to make
  13. # sure somebody doesn't try to use arg3 for something incompatible. -- gumby
  14. SRCDIR=${3-${SRCDIR-.}}
  15.  
  16. # Directory containing the original header files.
  17. # (This was named INCLUDES, but that conflicts with a name in Makefile.in.)
  18. INPUT=${2-${INPUT-/usr/include}}
  19.  
  20. # Directory in which to store the results.
  21. LIB=${1?"fixincludes: output directory not specified"}
  22.  
  23. # Define PWDCMD as a command to use to get the working dir
  24. # in the form that we want.
  25. PWDCMD=pwd
  26. case "`pwd`" in
  27. //*)
  28.     # On an Apollo, discard everything before `/usr'.
  29.     PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'"
  30.     ;;
  31. esac
  32.  
  33. # Original directory.
  34. ORIGDIR=`${PWDCMD}`
  35.  
  36. # Make sure it exists.
  37. if [ ! -d $LIB ]; then
  38.   mkdir $LIB || exit 1
  39. fi
  40.  
  41. # Make LIB absolute only if needed to avoid problems with the amd.
  42. case $LIB in
  43. /*)
  44.     ;;
  45. *)
  46.     cd $LIB; LIB=`${PWDCMD}`
  47.     ;;
  48. esac
  49.  
  50. # Make SRCDIR absolute only if needed to avoid problems with the amd.
  51. cd $ORIGDIR
  52. case $SRCDIR in
  53. /*)
  54.     ;;
  55. *)
  56.     cd $SRCDIR; SRCDIR=`${PWDCMD}`
  57.     ;;
  58. esac
  59.  
  60. # Fail if no arg to specify a directory for the output.
  61. if [ x$1 = x ]
  62. then echo fixincludes: no output directory specified
  63. exit 1
  64. fi
  65.  
  66. echo Building fixed headers in ${LIB}
  67.  
  68. # Determine whether this system has symbolic links.
  69. if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
  70.   rm -f $LIB/ShouldNotExist
  71.   LINKS=true
  72. elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then
  73.   rm -f /tmp/ShouldNotExist
  74.   LINKS=true
  75. else
  76.   LINKS=false
  77. fi
  78.  
  79. echo Finding directories and links to directories
  80. cd ${INPUT}
  81. # Find all directories and all symlinks that point to directories.
  82. # Put the list in $files.
  83. # Each time we find a symlink, add it to newdirs
  84. # so that we do another find within the dir the link points to.
  85. # Note that $files may have duplicates in it;
  86. # later parts of this file are supposed to ignore them.
  87. dirs="."
  88. levels=2
  89. while [ -n "$dirs" ] && [ $levels -gt 0 ]
  90. do
  91.     levels=`expr $levels - 1`
  92.     newdirs=
  93.     for d in $dirs
  94.     do
  95.     echo " Searching $INPUT/$d"
  96.     if [ "$d" != . ]
  97.     then
  98.         d=$d/.
  99.     fi
  100.  
  101.     # Find all directories under $d, relative to $d, excluding $d itself.
  102.         files="$files `find $d -type d -print | \
  103.                sed -e '/\/\.$/d' -e '/^\.$/d'`"
  104.     # Find all links to directories.
  105.     # Using `-exec test -d' in find fails on some systems,
  106.     # and trying to run test via sh fails on others,
  107.     # so this is the simplest alternative left.
  108.     # First find all the links, then test each one.
  109.     theselinks=
  110.     $LINKS && \
  111.       theselinks=`find $d -type l -print`
  112.     for d1 in $theselinks --dummy--
  113.     do
  114.         # If the link points to a directory,
  115.         # add that dir to $newdirs
  116.         if [ -d $d1 ]
  117.         then
  118.         newdirs="$newdirs $d1"
  119.         fi
  120.     done
  121.     done
  122.  
  123.     files="$files $newdirs"
  124.     dirs="$newdirs"
  125. done
  126.  
  127. dirs=
  128. echo "All directories (including links to directories):"
  129. echo $files
  130.  
  131. for file in $files; do
  132.   rm -rf $LIB/$file
  133.   if [ ! -d $LIB/$file ]
  134.   then mkdir $LIB/$file
  135.   fi
  136. done
  137. mkdir $LIB/root
  138.  
  139. # treetops gets an alternating list
  140. # of old directories to copy
  141. # and the new directories to copy to.
  142. treetops="${INPUT} ${LIB}"
  143.  
  144. if $LINKS; then
  145.   echo 'Making symbolic directory links'
  146.   for file in $files; do
  147.     dest=`ls -ld $file | sed -n 's/.*-> //p'`
  148.     if [ "$dest" ]; then    
  149.       cwd=`${PWDCMD}`
  150.       # In case $dest is relative, get to $file's dir first.
  151.       cd ${INPUT}
  152.       cd `echo ./$file | sed -n 's&[^/]*$&&p'`
  153.       # Check that the target directory exists.
  154.       # Redirections changed to avoid bug in sh on Ultrix.
  155.       (cd $dest) > /dev/null 2>&1
  156.       if [ $? = 0 ]; then
  157.     cd $dest
  158.     # X gets the dir that the link actually leads to.
  159.     x=`${PWDCMD}`
  160.     # If a link points to ., make a similar link to .
  161.     if [ $x = $INPUT ]; then
  162.       echo $file '->' . ': Making link'
  163.       rm -fr ${LIB}/$file > /dev/null 2>&1
  164.       ln -s . ${LIB}/$file > /dev/null 2>&1
  165.     # If link leads back into ${INPUT},
  166.     # make a similar link here.
  167.     elif expr $x : "${INPUT}/.*" > /dev/null; then
  168.       # Y gets the actual target dir name, relative to ${INPUT}.
  169.       y=`echo $x | sed -n "s&${INPUT}/&&p"`
  170.       # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
  171.       dots=`echo "$file" |
  172.         sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'`
  173.       echo $file '->' $dots$y ': Making link'
  174.       rm -fr ${LIB}/$file > /dev/null 2>&1
  175.       ln -s $dots$y ${LIB}/$file > /dev/null 2>&1
  176.     else
  177.       # If the link is to a dir $target outside ${INPUT},
  178.       # repoint the link at ${INPUT}/root$target
  179.       # and process $target into ${INPUT}/root$target
  180.       # treat this directory as if it actually contained the files.
  181.       echo $file '->' root$x ': Making link'
  182.       if [ -d $LIB/root$x ]
  183.       then true
  184.       else
  185.         dirname=root$x/
  186.         dirmade=.
  187.         cd $LIB
  188.         while [ x$dirname != x ]; do
  189.           component=`echo $dirname | sed -e 's|/.*$||'`
  190.           mkdir $component >/dev/null 2>&1
  191.           cd $component
  192.           dirmade=$dirmade/$component
  193.           dirname=`echo $dirname | sed -e 's|[^/]*/||'`
  194.         done
  195.       fi
  196.       # Duplicate directory structure created in ${LIB}/$file in new
  197.       # root area.
  198.       for file2 in $files; do
  199.         case $file2 in
  200.           $file/./*)
  201.         dupdir=${LIB}/root$x/`echo $file2 | sed -n "s|^${file}/||p"`
  202.         echo "Duplicating ${file}'s ${dupdir}"
  203.         if [ -d ${dupdir} ]
  204.         then true
  205.         else
  206.           mkdir ${dupdir}
  207.         fi
  208.         ;;
  209.           *)
  210.         ;;
  211.         esac
  212.           done
  213.       # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
  214.       dots=`echo "$file" |
  215.         sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'`
  216.       rm -fr ${LIB}/$file > /dev/null 2>&1
  217.       ln -s ${dots}root$x ${LIB}/$file > /dev/null 2>&1
  218.       treetops="$treetops $x ${LIB}/root$x"
  219.     fi
  220.       fi
  221.       cd $cwd
  222.     fi
  223.   done
  224. fi
  225.  
  226. required=
  227. set x $treetops
  228. shift
  229. while [ $# != 0 ]; do
  230.   # $1 is an old directory to copy, and $2 is the new directory to copy to.
  231.   cd ${INPUT}
  232.   cd $1
  233. # The same dir can appear more than once in treetops.
  234. # There's no need to scan it more than once.
  235.   if [ -f $2/DONE ]
  236.   then
  237.     files=
  238.   else
  239.     touch $2/DONE
  240.     echo Fixing directory $1 into $2
  241. # Check .h files which are symlinks as well as those which are files.
  242. # A link to a header file will not be processed by anything but this.
  243.     if $LINKS; then
  244.       files=`find . -name '*.h' \( -type f -o -type l \) -print`
  245.     else
  246.       files=`find . -name '*.h' -type f -print`
  247.     fi
  248.     echo Checking header files
  249.   fi
  250. # Note that BSD43_* are used on recent MIPS systems.
  251.   for file in $files; do
  252. # This call to egrep is essential, since checking a file with egrep
  253. # is much faster than actually trying to fix it.
  254. # It is also essential that most files *not* match!
  255. # Thus, matching every #endif is unacceptable.
  256. # But the argument to egrep must be kept small, or many versions of egrep
  257. # won't be able to handle it.
  258. #
  259. # We use the pattern [!-.0-~] instead of [^/     ] to match a noncomment
  260. # following #else or #endif because some buggy egreps think [^/] matches
  261. # newline, and they thus think `#else ' matches `#e[ndiflse]*[     ]+[^/     ]'.
  262. #
  263. # We use the pattern [^a-zA-Z0-9_][_a-ce-km-z][a-z0-9] to match an identifier
  264. # following #if or #elif that is not surrounded by __.  The `a-ce-km-z'
  265. # in this pattern lacks `d' and `l'; this means we don't worry about
  266. # identifiers starting with `d' or `l'.  This is OK, since none of the
  267. # identifiers below start with `d' or `l'.  It also greatly improves
  268. # performance, since many files contain lines of the form `#if ... defined ...'
  269. # or `#if lint'.
  270.     if egrep '//|[     _]_IO|CTRL|^#define.NULL|^#e[nl][ds][ief]*[     ]+[!-.0-~]|^#[el]*if.*[^a-zA-Z0-9_][_a-ce-km-z][a-z0-9]' $file >/dev/null; then
  271.       if [ -r $file ]; then
  272.     cp $file $2/$file >/dev/null 2>&1    \
  273.     || echo "Can't copy $file"
  274.     chmod +w $2/$file
  275.     chmod a+r $2/$file
  276.     # Here is how the sed commands in braces work.
  277.     # (It doesn't work to put the comments inside the sed commands.)
  278.         # Surround each word with spaces, to simplify matching below.
  279.         # ANSIfy each pre-ANSI machine-dependent symbol
  280.         # by surrounding it with __ __.
  281.         # Remove the spaces that we inserted around each word.
  282.     sed -e '
  283.                    :loop
  284.       /\\$/            N
  285.       /\\$/            b loop
  286.       s%^\([     ]*#[     ]*else\)[     ]*/[^*].*%\1%
  287.       s%^\([     ]*#[     ]*else\)[     ]*[^/     ].*%\1%
  288.       s%^\([     ]*#[     ]*endif\)[     ]*/[^*].*%\1%
  289.       s%^\([     ]*#[     ]*endif\)[     ]*\*[^/].*%\1%
  290.       s%^\([     ]*#[     ]*endif\)[     ]*[^/*     ].*%\1%
  291.       /\/\/[^*]/            s|//\(.*\)$|/*\1*/|
  292.       /[     ]_IO[A-Z]*[     ]*(/    s/\(_IO[A-Z]*[     ]*(\)\(.\),/\1'\''\2'\'',/
  293.       /[     ]BSD43__IO[A-Z]*[     ]*(/    s/(\(.\),/('\''\1'\'',/
  294.       /#define._IO/            s/'\''\([cgxtf]\)'\''/\1/g
  295.       /#define.BSD43__IO/        s/'\''\([cgx]\)'\''/\1/g
  296.       /[^A-Z0-9_]CTRL[     ]*(/        s/\([^'\'']\))/'\''\1'\'')/
  297.       /[^A-Z0-9]_CTRL[     ]*(/        s/\([^'\'']\))/'\''\1'\'')/
  298.       /#define[     ]*[     ]CTRL/        s/'\''\([cgx]\)'\''/\1/g
  299.       /#define[     ]*[     ]_CTRL/        s/'\''\([cgx]\)'\''/\1/g
  300.       /#define.BSD43_CTRL/        s/'\''\([cgx]\)'\''/\1/g
  301.       /#[el]*if/{
  302.         s/[a-zA-Z0-9_][a-zA-Z0-9_]*/ & /g
  303.  
  304.         s/ bsd4\([0-9]\) / __bsd4\1__ /g
  305.         s/ _*i386 / __i386__ /g
  306.         s/ is68k / __is68k__ /g
  307.         s/ m68k / __m68k__ /g
  308.         s/ mc680\([0-9]\)0 / __mc680\10__ /g
  309.         s/ news\([0-9]*\) / __news\1__ /g
  310.         s/ ns32000 / __ns32000__ /g
  311.         s/ pyr / __pyr__ /g
  312.         s/ sony_news / __sony_news__ /g
  313.         s/ sparc / __sparc__ /g
  314.         s/ sun\([a-z0-9]*\) / __sun\1__ /g
  315.         s/ unix / __unix__ /g
  316.         s/ vax / __vax__ /g
  317.  
  318.         s/ \([a-zA-Z0-9_][a-zA-Z0-9_]*\) /\1/g
  319.       }
  320.       /^#define.NULL[     ]/    i\
  321.         #undef NULL
  322.     ' $2/$file > $2/$file.
  323.     mv $2/$file. $2/$file
  324.     if cmp $file $2/$file >/dev/null 2>&1; then
  325.        rm $2/$file
  326.     else
  327.        echo Fixed $file
  328.        # Find any include directives that use "file".
  329.        for include in `egrep '^[     ]*#[     ]*include[     ]*"[^/]' $2/$file | sed -e 's/^[     ]*#[     ]*include[     ]*"\([^"]*\)".*$/\1/'`; do
  330.           dir=`echo $file | sed -e s'|/[^/]*$||'`
  331.           required="$required $1 $dir/$include $2/$dir/$include"
  332.        done
  333.     fi
  334.       fi
  335.     fi
  336.   done
  337.   shift; shift
  338. done
  339.  
  340. cd ${INPUT}
  341.  
  342. # Install the proper definition of size_t in header files that it comes from.
  343. for file in sys/types.h stdlib.h sys/stdtypes.h; do
  344.   if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  345.     cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  346.     chmod +w ${LIB}/$file 2>/dev/null
  347.     chmod a+r ${LIB}/$file 2>/dev/null
  348.   fi
  349.  
  350.   if [ -r ${LIB}/$file ]; then
  351.     echo Fixing $file comment
  352.     # Get the definition of __SIZE_TYPE__, if any.
  353.     # (This file must be called something.c).
  354.     echo "__SIZE_TYPE__" > ${LIB}/types.c
  355.     foo=`${GCCCMD} -E -P ${LIB}/types.c`
  356.     rm -f ${LIB}/types.c
  357.     # Default to our preferred type.
  358.     if [ "$foo" = __SIZE_TYPE__ ]; then foo="unsigned long int"; fi
  359.     sed -e "s/typedef[     a-z_]*[     ]size_t/typedef $foo size_t/" ${LIB}/$file > ${LIB}/${file}.sed
  360.     rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  361.     if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  362.       rm ${LIB}/$file
  363.     fi
  364.   fi
  365. done
  366.  
  367. # Fix one other error in this file: a mismatched quote not inside a C comment.
  368. file=sundev/vuid_event.h
  369. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  370.   mkdir ${LIB}/sundev 2>/dev/null
  371.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  372.   chmod +w ${LIB}/$file 2>/dev/null
  373.   chmod a+r ${LIB}/$file 2>/dev/null
  374. fi
  375.  
  376. if [ -r ${LIB}/$file ]; then
  377.   echo Fixing $file comment
  378.   sed -e "s/doesn't/does not/" ${LIB}/$file > ${LIB}/${file}.sed
  379.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  380.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  381.     rm ${LIB}/$file
  382.   fi
  383. fi
  384.  
  385. # Fix these Sun OS files to avoid an invalid identifier in an #ifdef.
  386. file=sunwindow/win_cursor.h
  387. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  388. #  mkdir ${LIB}/sunwindow 2>/dev/null
  389.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  390.   chmod +w ${LIB}/$file 2>/dev/null
  391. fi
  392. if [ -r ${LIB}/$file ]; then
  393.   echo Fixing $file
  394.   sed -e "s/ecd.cursor/ecd_cursor/" ${LIB}/$file > ${LIB}/${file}.sed
  395.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  396.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  397.     rm ${LIB}/$file
  398.   fi
  399. fi
  400. file=sunwindow/win_lock.h
  401. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  402. #  mkdir ${LIB}/sunwindow 2>/dev/null
  403.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  404.   chmod +w ${LIB}/$file 2>/dev/null
  405. fi
  406. if [ -r ${LIB}/$file ]; then
  407.   echo Fixing $file
  408.   sed -e "s/ecd.cursor/ecd_cursor/" ${LIB}/$file > ${LIB}/${file}.sed
  409.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  410.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  411.     rm ${LIB}/$file
  412.   fi
  413. fi
  414.  
  415. # Fix this Sun file to avoid interfering with stddef.h.
  416. file=sys/stdtypes.h
  417. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  418.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  419.   chmod +w ${LIB}/$file 2>/dev/null
  420.   chmod a+r ${LIB}/$file 2>/dev/null
  421. fi
  422.  
  423. if [ -r ${LIB}/$file ]; then
  424.   echo Fixing $file
  425. sed -e '/[     ]size_t.*;/i\
  426. #ifndef _GCC_SIZE_T\
  427. #define _GCC_SIZE_T' \
  428.     -e '/[     ]size_t.*;/a\
  429. #endif' \
  430.     -e '/[     ]ptrdiff_t.*;/i\
  431. #ifndef _GCC_PTRDIFF_T\
  432. #define _GCC_PTRDIFF_T' \
  433.     -e '/[     ]ptrdiff_t.*;/a\
  434. #endif' \
  435.     -e '/[     ]wchar_t.*;/i\
  436. #ifndef _GCC_WCHAR_T\
  437. #define _GCC_WCHAR_T' \
  438.     -e '/[     ]wchar_t.*;/a\
  439. #endif' ${LIB}/$file > ${LIB}/${file}.sed
  440.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  441.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  442.     rm ${LIB}/$file
  443.   fi
  444. fi
  445.  
  446. # Fix this ARM/RISCiX file to avoid interfering with the use of __wchar_t
  447. # in cc1plus.
  448. file=stdlib.h
  449. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  450.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  451.   chmod +w ${LIB}/$file 2>/dev/null
  452.   chmod a+r ${LIB}/$file 2>/dev/null
  453. fi
  454.  
  455. if [ -r ${LIB}/$file ]; then
  456.   echo Fixing $file
  457.   sed -e "s/\(#[     ]*ifndef[     ]*\)__wchar_t/\1_GCC_WCHAR_T/" \
  458.       -e "s/\(#[     ]*define[     ]*\)__wchar_t/\1_GCC_WCHAR_T/" \
  459.      ${LIB}/$file > ${LIB}/${file}.sed
  460.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  461.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  462.     rm ${LIB}/$file
  463.   fi
  464. fi
  465.  
  466. # Fix this file to avoid interfering with stddef.h, but don't mistakenly
  467. # match e.g. ssize_t present in AIX for the ps/2.
  468. file=sys/types.h
  469. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  470.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  471.   chmod +w ${LIB}/$file 2>/dev/null
  472.   chmod a+r ${LIB}/$file 2>/dev/null
  473. fi
  474.  
  475. if [ -r ${LIB}/$file ]; then
  476.   echo Fixing $file
  477. sed -e '/[     ]size_t.*;/i\
  478. #ifndef _GCC_SIZE_T\
  479. #define _GCC_SIZE_T' \
  480.     -e '/[     ]size_t.*;/a\
  481. #endif' ${LIB}/$file > ${LIB}/${file}.sed
  482.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  483.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  484.     rm ${LIB}/$file
  485.   fi
  486. fi
  487.  
  488. # Fix HP's use of ../machine/inline.h to refer to
  489. # /usr/include/machine/inline.h
  490. file=sys/spinlock.h
  491. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  492.   cp $file ${LIB}/$file
  493. fi
  494. if [ -r ${LIB}/$file ] ; then
  495.   echo Fixing $file
  496.   sed -e 's,"../machine/inline.h",<machine/inline.h>,' \
  497.     -e 's,"../machine/psl.h",<machine/psl.h>,' \
  498.   ${LIB}/$file > ${LIB}/${file}.sed
  499.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  500.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  501.     rm ${LIB}/$file
  502.   fi
  503. fi
  504.  
  505. # Fix an error in this file: the #if says _cplusplus, not the double
  506. # underscore __cplusplus that it should be
  507. file=tinfo.h
  508. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  509.   mkdir ${LIB}/rpcsvc 2>/dev/null
  510.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  511.   chmod +w ${LIB}/$file 2>/dev/null
  512.   chmod a+r ${LIB}/$file 2>/dev/null
  513. fi
  514.  
  515. if [ -r ${LIB}/$file ]; then
  516.   echo Fixing $file, __cplusplus macro
  517.   sed -e 's/[     ]_cplusplus/ __cplusplus/' ${LIB}/$file > ${LIB}/${file}.sed
  518.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  519.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  520.     rm ${LIB}/$file
  521.   fi
  522. fi
  523.  
  524. # Fix an error in this file: a missing semi-colon at the end of the statsswtch
  525. # structure definition.
  526. file=rpcsvc/rstat.h
  527. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  528.   mkdir ${LIB}/rpcsvc 2>/dev/null
  529.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  530.   chmod +w ${LIB}/$file 2>/dev/null
  531.   chmod a+r ${LIB}/$file 2>/dev/null
  532. fi
  533.  
  534. if [ -r ${LIB}/$file ]; then
  535.   echo Fixing $file, definition of statsswtch
  536.   sed -e 's/boottime$/boottime;/' ${LIB}/$file > ${LIB}/${file}.sed
  537.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  538.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  539.     rm ${LIB}/$file
  540.   fi
  541. fi
  542.  
  543. # Fix an error in this file: a missing semi-colon at the end of the nodeent
  544. # structure definition.
  545. file=netdnet/dnetdb.h
  546. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  547.   mkdir ${LIB}/netdnet 2>/dev/null
  548.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  549.   chmod +w ${LIB}/$file 2>/dev/null
  550.   chmod a+r ${LIB}/$file 2>/dev/null
  551. fi
  552.  
  553. if [ -r ${LIB}/$file ]; then
  554.   echo Fixing $file, definition of nodeent
  555.   sed -e 's/char.*na_addr *$/char *na_addr;/' ${LIB}/$file > ${LIB}/${file}.sed
  556.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  557.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  558.     rm ${LIB}/$file
  559.   fi
  560. fi
  561.  
  562. # Check for bad #ifdef line (in Ultrix 4.1)
  563. file=sys/file.h
  564. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  565.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  566.   chmod +w ${LIB}/$file 2>/dev/null
  567.   chmod a+r ${LIB}/$file 2>/dev/null
  568. fi
  569.  
  570. if [ -r ${LIB}/$file ]; then
  571.   echo Fixing $file, bad \#ifdef line
  572.   sed -e 's/#ifdef KERNEL/#if defined(KERNEL)/' ${LIB}/$file > ${LIB}/${file}.sed
  573.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  574.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  575.     rm ${LIB}/$file
  576.   fi
  577. fi
  578.  
  579. # Check for superfluous `static' (in Ultrix 4.2)
  580. file=machine/cpu.h
  581. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  582.   mkdir ${LIB}/machine 2>/dev/null
  583.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  584.   chmod +w ${LIB}/$file 2>/dev/null
  585.   chmod a+r ${LIB}/$file 2>/dev/null
  586. fi
  587.  
  588. if [ -r ${LIB}/$file ]; then
  589.   echo Fixing $file, superfluous static
  590.   sed -e 's/^static struct tlb_pid_state/struct tlb_pid_state/' ${LIB}/$file > ${LIB}/${file}.sed
  591.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  592.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  593.     rm ${LIB}/$file
  594.   else
  595. # This file has an alternative name, mips/cpu.h.  Fix that name, too.
  596.     if cmp machine/cpu.h mips/cpu.h > /dev/null 2>&1; then
  597.       mkdir ${LIB}/mips 2>&-
  598.       ln ${LIB}/$file ${LIB}/mips/cpu.h 
  599.     fi
  600.   fi
  601. fi
  602.  
  603. # Incorrect sprintf declaration in X11/Xmu.h
  604. file=X11/Xmu.h
  605. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  606.   mkdir ${LIB}/X11 2>/dev/null
  607.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  608.   chmod +w ${LIB}/$file 2>/dev/null
  609.   chmod a+r ${LIB}/$file 2>/dev/null
  610. fi
  611.  
  612. if [ -r ${LIB}/$file ]; then
  613.   echo Fixing $file sprintf declaration
  614.   sed -e 's,^extern char \*    sprintf();$,#ifndef __STDC__\
  615. extern char *    sprintf();\
  616. #endif /* !defined __STDC__ */,' ${LIB}/$file > ${LIB}/${file}.sed
  617.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  618.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  619.     rm ${LIB}/$file
  620.   fi
  621. fi
  622.  
  623. # Incorrect sprintf declaration in X11/Xmu/Xmu.h
  624. # (It's not clear whether the right file name is this or X11/Xmu.h.)
  625. file=X11/Xmu/Xmu.h
  626. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  627.   mkdir ${LIB}/X11/Xmu 2>/dev/null
  628.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  629.   chmod +w ${LIB}/$file 2>/dev/null
  630.   chmod a+r ${LIB}/$file 2>/dev/null
  631. fi
  632.  
  633. if [ -r ${LIB}/$file ]; then
  634.   echo Fixing $file sprintf declaration
  635.   sed -e 's,^extern char \*    sprintf();$,#ifndef __STDC__\
  636. extern char *    sprintf();\
  637. #endif /* !defined __STDC__ */,' ${LIB}/$file > ${LIB}/${file}.sed
  638.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  639.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  640.     rm ${LIB}/$file
  641.   fi
  642. fi
  643.  
  644. # Check for missing ';' in struct
  645. file=netinet/ip.h
  646. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  647.   mkdir ${LIB}/netinet 2>/dev/null
  648.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  649.   chmod +w ${LIB}/$file 2>/dev/null
  650.   chmod a+r ${LIB}/$file 2>/dev/null
  651. fi
  652.  
  653. if [ -r ${LIB}/$file ]; then
  654.   echo Fixing $file
  655.   sed -e '/^struct/,/^};/s/}$/};/' ${LIB}/$file > ${LIB}/${file}.sed
  656.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  657.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  658.     rm -f ${LIB}/$file
  659.   fi
  660. fi
  661.  
  662. # Fix the CAT macro in SunOS memvar.h.
  663. file=pixrect/memvar.h
  664. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  665.   mkdir ${LIB}/pixrect 2>/dev/null
  666.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  667.   chmod +w ${LIB}/$file 2>/dev/null
  668.   chmod a+r ${LIB}/$file 2>/dev/null
  669. fi
  670.  
  671. if [ -r ${LIB}/$file ]; then
  672.   echo Fixing $file
  673.   sed -e '/^#define.CAT(a,b)/ i\
  674. #ifdef __STDC__ \
  675. #define CAT(a,b) a##b\
  676. #else
  677. /^#define.CAT(a,b)/ a\
  678. #endif
  679. ' ${LIB}/$file > ${LIB}/${file}.sed
  680.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  681.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  682.     rm -f ${LIB}/$file
  683.   fi
  684. fi
  685.  
  686. # Check for yet more missing ';' in struct (in SunOS 4.0.x)
  687. file=rpcsvc/rusers.h
  688. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  689.   mkdir ${LIB}/rpcsvc 2>/dev/null
  690.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  691.   chmod +w ${LIB}/$file 2>/dev/null
  692.   chmod a+r ${LIB}/$file 2>/dev/null
  693. fi
  694.  
  695. if [ -r ${LIB}/$file ]; then
  696.   echo Fixing $file
  697.   sed -e '/^struct/,/^};/s/_cnt$/_cnt;/' ${LIB}/$file > ${LIB}/${file}.sed
  698.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  699.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  700.     rm -f ${LIB}/$file
  701.   fi
  702. fi
  703.  
  704. # Fix return type of exit and abort in <stdlib.h> on SunOS 4.1.
  705. # Also wrap protection around size_t for m88k-sysv3 systems.
  706. file=stdlib.h
  707. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  708.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  709.   chmod +w ${LIB}/$file 2>/dev/null
  710.   chmod a+r ${LIB}/$file 2>/dev/null
  711. fi
  712.  
  713. if [ -r ${LIB}/$file ]; then
  714.   echo Fixing $file
  715.   sed -e 's/int    abort/void    abort/g' \
  716.   -e 's/int    free/void    free/g' \
  717.   -e 's/char \*    calloc/void \*    calloc/g' \
  718.   -e 's/char \*    malloc/void \*    malloc/g' \
  719.   -e 's/char \*    realloc/void \*    realloc/g' \
  720.   -e 's/int    exit/void    exit/g' \
  721.   -e '/typedef[     a-zA-Z_]*[     ]size_t[     ]*;/i\
  722. #ifndef _GCC_SIZE_T\
  723. #define _GCC_SIZE_T' \
  724.   -e '/typedef[     a-zA-Z_]*[     ]size_t[     ]*;/a\
  725. #endif' \
  726.       ${LIB}/$file > ${LIB}/${file}.sed
  727.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  728.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  729.     rm -f ${LIB}/$file
  730.   fi
  731. fi
  732.  
  733. # Fix return type of free and {c,m,re}alloc in <malloc.h> on SunOS 4.1.
  734. file=malloc.h
  735. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  736.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  737.   chmod +w ${LIB}/$file 2>/dev/null
  738.   chmod a+r ${LIB}/$file 2>/dev/null
  739. fi
  740.  
  741. if [ -r ${LIB}/$file ]; then
  742.   echo Fixing $file
  743.   sed -e 's/typedef[     ]char \*    malloc_t/typedef void \*    malloc_t/g' \
  744.   -e 's/int[     ][     ]*free/void    free/g' \
  745.   ${LIB}/$file > ${LIB}/${file}.sed
  746.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  747.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  748.     rm -f ${LIB}/$file
  749.   fi
  750. fi
  751.  
  752. # Fix bogus #ifdef in <hsfs/hsfs_spec.h> on SunOS 4.1.
  753. file=hsfs/hsfs_spec.h
  754. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  755.   mkdir ${LIB}/hsfs 2>/dev/null
  756.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  757.   chmod +w ${LIB}/$file 2>/dev/null
  758.   chmod a+r ${LIB}/$file 2>/dev/null
  759. fi
  760.  
  761. if [ -r ${LIB}/$file ]; then
  762.   echo Fixing $file
  763.   sed -e 's/\#ifdef __i386__ || __vax__/\#if __i386__ || __vax__/g' \
  764.     ${LIB}/$file > ${LIB}/${file}.
  765.   rm -f ${LIB}/$file; mv ${LIB}/${file}. ${LIB}/$file
  766.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  767.     rm -f ${LIB}/$file
  768.   fi
  769. fi
  770.  
  771. # Fix bogus #ifdef in <hsfs/hsnode.h> on SunOS 4.1.
  772. file=hsfs/hsnode.h
  773. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  774.   mkdir ${LIB}/hsfs 2>/dev/null
  775.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  776.   chmod +w ${LIB}/$file 2>/dev/null
  777.   chmod a+r ${LIB}/$file 2>/dev/null
  778. fi
  779.  
  780. if [ -r ${LIB}/$file ]; then
  781.   echo Fixing $file
  782.   sed -e 's/\#ifdef __i386__ || __sun4c__/\#if __i386__ || __sun4c__/g' \
  783.     ${LIB}/$file > ${LIB}/${file}.sed
  784.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  785.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  786.     rm -f ${LIB}/$file
  787.   fi
  788. fi
  789.  
  790. # Fix bogus #ifdef in <hsfs/iso_spec.h> on SunOS 4.1.
  791. file=hsfs/iso_spec.h
  792. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  793.   mkdir ${LIB}/hsfs 2>/dev/null
  794.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  795.   chmod +w ${LIB}/$file 2>/dev/null
  796.   chmod a+r ${LIB}/$file 2>/dev/null
  797. fi
  798.  
  799. if [ -r ${LIB}/$file ]; then
  800.   echo Fixing $file
  801.   sed -e 's/\#ifdef __i386__ || __vax__/\#if __i386__ || __vax__/g' \
  802.     ${LIB}/$file > ${LIB}/${file}.sed
  803.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  804.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  805.     rm -f ${LIB}/$file
  806.   fi
  807. fi
  808.  
  809. # Incorrect #include in Sony News-OS 3.2.
  810. file=machine/machparam.h
  811. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  812.   mkdir ${LIB}/machine 2>/dev/null
  813.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  814.   chmod +w ${LIB}/$file 2>/dev/null
  815.   chmod a+r ${LIB}/$file 2>/dev/null
  816. fi
  817.  
  818. if [ -r ${LIB}/$file ]; then
  819.   echo Fixing $file, incorrect \#include
  820.   sed -e 's@"../machine/endian.h"@<machine/endian.h>@' \
  821.     ${LIB}/$file > ${LIB}/${file}.
  822.   rm -f ${LIB}/$file; mv ${LIB}/${file}. ${LIB}/$file
  823.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  824.     rm -f ${LIB}/$file
  825.   fi
  826. fi
  827.  
  828. # Multiline comment after typedef on IRIX 4.0.1.
  829. file=sys/types.h
  830. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  831.   mkdir ${LIB}/sys 2>/dev/null
  832.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  833.   chmod +w ${LIB}/$file 2>/dev/null
  834.   chmod a+r ${LIB}/$file 2>/dev/null
  835. fi
  836.  
  837. if [ -r ${LIB}/$file ]; then
  838.   echo Fixing $file, comment in the middle of \#ifdef
  839.   sed -e 's@type of the result@type of the result */@' \
  840.     -e 's@of the sizeof@/* of the sizeof@' \
  841.     ${LIB}/$file > ${LIB}/${file}.sed
  842.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  843.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  844.     rm -f ${LIB}/$file
  845.   fi
  846. fi
  847.  
  848. # Turning // comments into /* */ comments trashes this IRIX 4.0.1
  849. # header file, which embeds // comments inside multi-line /* */
  850. # comments.  If this looks like the IRIX header file, we refix it by
  851. # just throwing away the // comments.
  852. file=fam.h
  853. if [ -r ${LIB}/$file ]; then
  854.   if egrep indigo.esd ${LIB}/$file > /dev/null; then
  855.     echo Fixing $file, overeager sed script
  856.     rm ${LIB}/$file
  857.     sed -e 's|//.*$||g' $file > ${LIB}/$file
  858.     chmod +w ${LIB}/$file 2>/dev/null
  859.     chmod a+r ${LIB}/$file 2>/dev/null
  860.   fi
  861. fi
  862.  
  863. # Some IRIX header files contains the string "//"
  864. for file in elf_abi.h elf.h; do
  865.   if [ -r ${LIB}/$file ]; then
  866.     echo Fixing $file, overeager sed script
  867.     sed -e 's|"/\*"\*/|"//"|' ${LIB}/$file > ${LIB}/${file}.sed
  868.     rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  869.     if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  870.       rm -f ${LIB}/$file
  871.     fi
  872.   fi
  873. done
  874.  
  875. # Same problem with a file from SunOS 4.1.3 : a header file containing
  876. # the string "//" embedded in "/**/"
  877. file=sbusdev/audiovar.h
  878. if [ -r ${LIB}/$file ]; then
  879.   echo Fixing $file, overeager sed script
  880.   rm ${LIB}/$file
  881.   sed -e 's|//.*$||g' $file > ${LIB}/$file
  882.   chmod +w ${LIB}/$file 2>/dev/null
  883.   chmod a+r ${LIB}/$file 2>/dev/null
  884. fi
  885.  
  886. # Fix non-ANSI memcpy declaration that conflicts with gcc's builtin
  887. # declaration on Sun OS 4.x.  We must only fix this on Sun OS 4.x, because
  888. # many other systems have similar text but correct versions of the file.
  889. # To ensure only Sun's is fixed, we grep for a likely unique string.
  890. file=memory.h
  891. if [ -r $file ] && egrep '/\*    @\(#\)memory\.h 1\.[2-4] 8./../.. SMI; from S5R2 1\.2    \*/' $file > /dev/null; then
  892.   if [ ! -r ${LIB}/$file ]; then
  893.     cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  894.     chmod +w ${LIB}/$file 2>/dev/null
  895.     chmod a+r ${LIB}/$file 2>/dev/null
  896.   fi
  897.   if [ -r ${LIB}/$file ]; then
  898.     echo Replacing $file
  899.     cat > ${LIB}/$file << EOF
  900. /* This file was generated by fixincludes */
  901. #ifndef __memory_h__
  902. #define __memory_h__
  903.  
  904. #ifdef __STDC__
  905. extern void *memccpy();
  906. extern void *memchr();
  907. extern void *memcpy();
  908. extern void *memset();
  909. #else
  910. extern char *memccpy();
  911. extern char *memchr();
  912. extern char *memcpy();
  913. extern char *memset();
  914. #endif /* __STDC__ */
  915.  
  916. extern int memcmp();
  917.  
  918. #endif /* __memory_h__ */
  919. EOF
  920.   fi
  921. fi
  922.  
  923. # parameters not const on DECstation Ultrix V4.0.
  924. file=stdio.h
  925. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  926.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  927.   chmod +w ${LIB}/$file 2>/dev/null
  928.   chmod a+r ${LIB}/$file 2>/dev/null
  929. fi
  930.  
  931. if [ -r ${LIB}/$file ]; then
  932.   echo Fixing $file, non-const arg
  933.   sed -e 's@perror( char \*__s );@perror( const char *__s );@' \
  934.       -e 's@fputs( char \*__s,@fputs( const char *__s,@' \
  935.       -e 's@fopen( char \*__filename, char \*__type );@fopen( const char *__filename, const char *__type );@' \
  936.       -e 's@fwrite( void \*__ptr,@fwrite( const void *__ptr,@' \
  937.       -e 's@fscanf( FILE \*__stream, char \*__format,@fscanf( FILE *__stream, const char *__format,@' \
  938.       -e 's@scanf( char \*__format,@scanf( const char *__format,@' \
  939.       -e 's@sscanf( char \*__s, char \*__format,@sscanf( const char *__s, const char *__format,@' \
  940.     ${LIB}/$file > ${LIB}/${file}.sed
  941.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  942.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  943.     rm -f ${LIB}/$file
  944.   fi
  945. fi
  946.  
  947. # parameters conflict with C++ new on rs/6000 
  948. for file in stdio.h unistd.h ; do
  949.   if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  950.     cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  951.     chmod +w ${LIB}/$file 2>/dev/null
  952.   fi
  953.  
  954.   if [ -r ${LIB}/$file ]; then
  955.     echo Fixing $file, parameter name conflicts
  956.     sed -e 's@rename(const char \*old, const char \*new)@rename(const char *_old, const char *_new)@' \
  957.       ${LIB}/$file > ${LIB}/${file}.sed
  958.     rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  959.     if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  960.       rm -f ${LIB}/$file
  961.     fi
  962.   fi
  963. done
  964.  
  965. # function class(double x) conflicts with C++ keyword on rs/6000 
  966. file=math.h
  967. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  968.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  969.   chmod +w ${LIB}/$file 2>/dev/null
  970.   chmod a+r ${LIB}/$file 2>/dev/null
  971. fi
  972.  
  973. if [ -r ${LIB}/$file ]; then
  974.   if grep 'class[(]' ${LIB}/$file >/dev/null; then
  975.     echo Fixing $file
  976.     sed -e '/class[(]/i\
  977. #ifndef __cplusplus' \
  978.         -e '/class[(]/a\
  979. #endif' ${LIB}/$file > ${LIB}/${file}.sed
  980.     rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  981.     if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  982.       rm ${LIB}/$file
  983.     fi
  984.   fi
  985. fi
  986.  
  987. # Wrong fchmod prototype on RS/6000.
  988. file=sys/stat.h
  989. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  990.   mkdir ${LIB}/sys 2>/dev/null
  991.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  992.   chmod +w ${LIB}/$file 2>/dev/null
  993.   chmod a+r ${LIB}/$file 2>/dev/null
  994. fi
  995.  
  996. if [ -r ${LIB}/$file ]; then
  997.   echo Fixing $file, fchmod prototype
  998.   sed -e 's/fchmod(char \*/fchmod(int/' \
  999.     ${LIB}/$file > ${LIB}/$file.sed
  1000.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1001.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1002.     rm -f ${LIB}/$file
  1003.   fi
  1004. fi
  1005.  
  1006. # NeXT 2.0 defines 'int wait(union wait*)', which conflicts with Posix.1.
  1007. # Note that version 3 of the NeXT system has wait.h in a different directory,
  1008. # so that this code won't do anything.  But wait.h in version 3 has a
  1009. # conditional, so it doesn't need this fix.  So everything is okay.
  1010. file=sys/wait.h
  1011. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1012.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1013.   chmod +w ${LIB}/$file 2>/dev/null
  1014. fi
  1015.  
  1016. if [ -r ${LIB}/$file ] \
  1017.   && grep 'wait[(]union wait' ${LIB}/$file >/dev/null; then
  1018.   echo Fixing $file, bad wait formal
  1019.   sed -e 's@wait(union wait@wait(void@' ${LIB}/$file > ${LIB}/${file}.sed
  1020.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1021.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1022.     rm -f ${LIB}/$file
  1023.   fi
  1024. fi
  1025.  
  1026. # Don't use or define the name va_list in stdio.h.
  1027. # This is for ANSI and also to interoperate properly with gvarargs.h.
  1028. file=stdio.h
  1029. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1030.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1031.   chmod +w ${LIB}/$file 2>/dev/null
  1032.   chmod a+r ${LIB}/$file 2>/dev/null
  1033. fi
  1034.  
  1035. if [ -r ${LIB}/$file ]; then
  1036.   echo Fixing $file, use of va_list
  1037.   # Arrange for stdio.h to use stdarg.h to define __gnuc_va_list
  1038.   (echo "#define __need___va_list"
  1039.    echo "#include <stdarg.h>") > ${LIB}/${file}.sed
  1040.   # Use __gnuc_va_list in arg types in place of va_list.
  1041.   # On 386BSD use __gnuc_va_list instead of _VA_LIST_. We're hoping the
  1042.   # trailing parentheses and semicolon save all other systems from this.
  1043.   # Define __va_list__ (something harmless and unused) instead of va_list.
  1044.   # Don't claim to have defined va_list.
  1045.   sed -e 's@ va_list @ __gnuc_va_list @' \
  1046.       -e 's@ va_list)@ __gnuc_va_list)@' \
  1047.       -e 's@ _VA_LIST_));@ __gnuc_va_list));@' \
  1048.       -e 's@ va_list@ __va_list__@' \
  1049.       -e 's@\*va_list@*__va_list__@' \
  1050.       -e 's@ __va_list)@ __gnuc_va_list)@' \
  1051.       -e 's@_NEED___VA_LIST@_NEED___Va_LIST@' \
  1052.       -e 's@VA_LIST@DUMMY_VA_LIST@' \
  1053.       -e 's@_NEED___Va_LIST@_NEED___VA_LIST@' \
  1054.     ${LIB}/$file >> ${LIB}/${file}.sed
  1055.   
  1056.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1057.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1058.     rm -f ${LIB}/$file
  1059.   fi
  1060. fi
  1061.  
  1062. # Cancel out ansi_compat.h on Ultrix.  Replace it with empty file.
  1063. file=ansi_compat.h
  1064. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1065.   if grep -s ULTRIX $file; then
  1066.     echo "/* This file intentionally left blank.  */" > $LIB/$file
  1067.   fi
  1068. fi
  1069.  
  1070. # parameter to atof not const on DECstation Ultrix V4.0.
  1071. # also get rid of bogus inline definitions in HP-UX 8.0
  1072. file=math.h
  1073. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1074.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1075.   chmod +w ${LIB}/$file 2>/dev/null
  1076.   chmod a+r ${LIB}/$file 2>/dev/null
  1077. fi
  1078.  
  1079. if [ -r ${LIB}/$file ]; then
  1080.   echo Fixing $file, non-const arg
  1081.   sed -e 's@atof( char \*__nptr );@atof( const char *__nptr );@' \
  1082.       -e 's@inline int abs(int [a-z][a-z]*) {.*}@@' \
  1083.       -e 's@inline double abs(double [a-z][a-z]*) {.*}@@' \
  1084.       -e 's@inline int sqr(int [a-z][a-z]*) {.*}@@' \
  1085.       -e 's@inline double sqr(double [a-z][a-z]*) {.*}@@' \
  1086.     ${LIB}/$file > ${LIB}/${file}.sed
  1087.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1088.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1089.     rm -f ${LIB}/$file
  1090.   fi
  1091. fi
  1092.  
  1093. # Avoid nested comments on Ultrix 4.3.
  1094. file=rpc/svc.h
  1095. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1096.   mkdir ${LIB}/rpc 2>/dev/null
  1097.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1098.   chmod +w ${LIB}/$file 2>/dev/null
  1099.   chmod a+r ${LIB}/$file 2>/dev/null
  1100. fi
  1101.  
  1102. if [ -r ${LIB}/$file ]; then
  1103.   echo Fixing $file, nested comment
  1104.   sed -e 's@^\( \*    int protocol;  \)/\*@\1*/ /*@' \
  1105.     ${LIB}/$file > ${LIB}/$file.sed
  1106.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1107.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1108.     rm -f ${LIB}/$file
  1109.   fi
  1110. fi
  1111.  
  1112. # In limits.h, put #ifndefs around things that are supposed to be defined
  1113. # in float.h to avoid redefinition errors if float.h is included first.
  1114. # On HP/UX this patch does not work, because on HP/UX limits.h uses
  1115. # multi line comments and the inserted #endif winds up inside the
  1116. # comment.  Fortunately, HP/UX already uses #ifndefs in limits.h; if
  1117. # we find a #ifndef FLT_MIN we assume that all the required #ifndefs
  1118. # are there, and we do not add them ourselves.
  1119. for file in limits.h sys/limits.h; do
  1120.   if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1121.     mkdir ${LIB}/sys 2>/dev/null
  1122.     cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1123.     chmod +w ${LIB}/$file 2>/dev/null
  1124.     chmod a+r ${LIB}/$file 2>/dev/null
  1125.   fi
  1126.  
  1127.   if [ -r ${LIB}/$file ]; then
  1128.     if egrep 'ifndef[     ]+FLT_MIN' ${LIB}/$file >/dev/null; then
  1129.       true
  1130.     else
  1131.       echo Fixing $file
  1132.       sed -e '/[     ]FLT_MIN[     ]/i\
  1133. #ifndef FLT_MIN'\
  1134.       -e '/[     ]FLT_MIN[     ]/a\
  1135. #endif'\
  1136.       -e '/[     ]FLT_MAX[     ]/i\
  1137. #ifndef FLT_MAX'\
  1138.       -e '/[     ]FLT_MAX[     ]/a\
  1139. #endif'\
  1140.       -e '/[     ]FLT_DIG[     ]/i\
  1141. #ifndef FLT_DIG'\
  1142.       -e '/[     ]FLT_DIG[     ]/a\
  1143. #endif'\
  1144.       -e '/[     ]DBL_MIN[     ]/i\
  1145. #ifndef DBL_MIN'\
  1146.       -e '/[     ]DBL_MIN[     ]/a\
  1147. #endif'\
  1148.       -e '/[     ]DBL_MAX[     ]/i\
  1149. #ifndef DBL_MAX'\
  1150.       -e '/[     ]DBL_MAX[     ]/a\
  1151. #endif'\
  1152.       -e '/[     ]DBL_DIG[     ]/i\
  1153. #ifndef DBL_DIG'\
  1154.       -e '/[     ]DBL_DIG[     ]/a\
  1155. #endif'\
  1156.     ${LIB}/$file > ${LIB}/${file}.sed
  1157.       rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1158.     fi
  1159.     if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1160.       echo Deleting ${LIB}/$file\; no fixes were needed.
  1161.       rm -f ${LIB}/$file
  1162.     fi
  1163.   fi
  1164. done
  1165.  
  1166. # In math.h, put #ifndefs around things that might be defined in a gcc
  1167. # specific math-*.h file.
  1168. file=math.h
  1169. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1170.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1171.   chmod +w ${LIB}/$file 2>/dev/null
  1172.   chmod a+r ${LIB}/$file 2>/dev/null
  1173. fi
  1174.  
  1175. if [ -r ${LIB}/$file ]; then
  1176.   echo Fixing $file
  1177.   sed -e '/define[     ]HUGE_VAL[     ]/i\
  1178. #ifndef HUGE_VAL'\
  1179.       -e '/define[     ]HUGE_VAL[     ]/a\
  1180. #endif'\
  1181.     ${LIB}/$file > ${LIB}/${file}.sed
  1182.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1183.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1184.     echo Deleting ${LIB}/$file\; no fixes were needed.
  1185.     rm -f ${LIB}/$file
  1186.   fi
  1187. fi
  1188.  
  1189. # Remove erroneous parentheses in sym.h on Alpha OSF/1.
  1190. file=sym.h
  1191. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1192.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1193.   chmod +w ${LIB}/$file 2>/dev/null
  1194.   chmod a+r ${LIB}/$file 2>/dev/null
  1195. fi
  1196.  
  1197. if [ -r ${LIB}/$file ]; then
  1198.   echo Fixing $file
  1199.   sed -e 's/#ifndef(__mips64)/#ifndef __mips64/' \
  1200.     ${LIB}/$file > ${LIB}/${file}.sed
  1201.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1202.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1203.     rm -f ${LIB}/$file
  1204.   fi
  1205. fi
  1206.  
  1207. # Fix incorrect S_IF* definitions on m88k-sysv3.
  1208. file=sys/stat.h
  1209. if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1210.   cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1211.   chmod +w ${LIB}/$file 2>/dev/null
  1212.   chmod a+r ${LIB}/$file 2>/dev/null
  1213. fi
  1214.  
  1215. if [ -r ${LIB}/$file ]; then
  1216.   echo Fixing $file
  1217.   sed -e 's/^\(#define[     ]*S_IS[A-Z]*(m)\)[     ]*(m[     ]*&[     ]*\(S_IF[A-Z][A-Z][A-Z][A-Z]*\)[     ]*)/\1 (((m)\&S_IFMT)==\2)/' \
  1218.       -e 's/^\(#define[     ]*S_IS[A-Z]*(m)\)[     ]*(m[     ]*&[     ]*\(0[0-9]*\)[     ]*)/\1 (((m)\&S_IFMT)==\2)/' \
  1219.     ${LIB}/$file > ${LIB}/${file}.sed
  1220.   rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1221.   if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1222.     rm -f ${LIB}/$file
  1223.   fi
  1224. fi
  1225.  
  1226. # Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1.
  1227. for file in stdio.h stdlib.h; do
  1228.   if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1229.     cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1230.     chmod +w ${LIB}/$file 2>/dev/null
  1231.     chmod a+r ${LIB}/$file 2>/dev/null
  1232.   fi
  1233.  
  1234.   if [ -r ${LIB}/$file ]; then
  1235.     echo Fixing $file, getopt declaration
  1236.     sed -e 's/getopt(int, char \*\[\],char \*)/getopt(int, char *const[], const char *)/' \
  1237.       ${LIB}/$file > ${LIB}/${file}.sed
  1238.     rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1239.     if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1240.       rm -f ${LIB}/$file
  1241.     fi
  1242.   fi
  1243. done
  1244.  
  1245. # These two files on SunOS 4 are included by other files
  1246. # in the same directory, using "...".  So we must make sure they exist
  1247. # in the same directory as the other fixed files.
  1248. if [ -r ${INPUT}/multimedia/audio_errno.h ]
  1249. then
  1250.   ln -s ${INPUT}/multimedia/audio_errno.h ${LIB}/multimedia 2>/dev/null
  1251. fi
  1252. if [ -r ${INPUT}/multimedia/audio_hdr.h ]
  1253. then
  1254.   ln -s ${INPUT}/multimedia/audio_hdr.h ${LIB}/multimedia 2>/dev/null
  1255. fi
  1256.  
  1257. # Determine if we're on Interactive Unix 2.2 or later, in which case we
  1258. # need to fix some additional files.  This is the same test for ISC that
  1259. # Autoconf uses.
  1260. if test -d /etc/conf/kconfig.d \
  1261.     && grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1; then
  1262.   echo "Fixing ISC __STDC__ goof in several files..."
  1263.   for name in stdio.h math.h ctype.h sys/limits.h sys/fcntl.h sys/dirent.h; do
  1264.     echo $name
  1265.     if test -r ${LIB}/$name; then
  1266.       file=${LIB}/$name
  1267.     else
  1268.       file=${INPUT}/$name
  1269.     fi
  1270.     # On Interactive 2.2, certain traditional Unix definitions
  1271.     # (notably getc and putc in stdio.h) are omitted if __STDC__ is
  1272.     # defined, not just if _POSIX_SOURCE is defined.  This makes it
  1273.     # impossible to compile any nontrivial program except with -posix.
  1274.     sed \
  1275. 's/!defined(__STDC__) && !defined(_POSIX_SOURCE)/!defined(_POSIX_SOURCE)/' \
  1276.         < $file > ${LIB}/$name.
  1277.     mv ${LIB}/$name. ${LIB}/$name
  1278.   done
  1279.   
  1280.   echo "Fixing ISC fmod declaration"
  1281.   # This one's already been fixed for other things.
  1282.   file=${LIB}/math.h
  1283.   sed 's/fmod(double)/fmod(double, double)/' <$file >$file.
  1284.   mv $file. $file
  1285.   
  1286.   echo "Fixing nested comments in ISC <sys/limits.h>"
  1287.   file=sys/limits.h
  1288.   sed '/CHILD_MAX/s,/\* Max, Max,' < ${INPUT}/$file >${LIB}/$file.
  1289.   sed '/OPEN_MAX/s,/\* Max, Max,' < ${LIB}/$file. >${LIB}/$file
  1290. fi
  1291.  
  1292. # These files in Sun OS 4.x use /**/ to concatenate tokens.
  1293. for file in sparc/asm_linkage.h sun3/asm_linkage.h sun3x/asm_linkage.h    \
  1294.     sun4/asm_linkage.h sun4c/asm_linkage.h sun4m/asm_linkage.h    \
  1295.     sun4c/debug/asm_linkage.h sun4m/debug/asm_linkage.h;
  1296. do
  1297.   if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1298.     cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1299.     chmod +w ${LIB}/$file 2>/dev/null
  1300.     chmod a+r ${LIB}/$file 2>/dev/null
  1301.   fi
  1302.  
  1303.   if [ -r ${LIB}/$file ]; then
  1304.     sed -e 's|/\*\*/|##|g' ${LIB}/$file > ${LIB}/${file}.sed
  1305.     rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1306.     if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1307.       rm -f ${LIB}/$file
  1308.     fi
  1309.   fi
  1310. done
  1311.  
  1312. # These files in ARM/RISCiX use /**/ to concatenate tokens.
  1313. for file in arm/as_support.h arm/mc_type.h arm/xcb.h dev/chardefmac.h \
  1314.     dev/ps_irq.h dev/screen.h dev/scsi.h sys/tty.h Xm.acorn/XmP.h
  1315. do
  1316.   if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  1317.     cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  1318.     chmod +w ${LIB}/$file 2>/dev/null
  1319.     chmod a+r ${LIB}/$file 2>/dev/null
  1320.   fi
  1321.  
  1322.   if [ -r ${LIB}/$file ]; then
  1323.     sed -e 's|/\*\*/|##|g' ${LIB}/$file > ${LIB}/${file}.sed
  1324.     rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  1325.     if cmp $file ${LIB}/$file >/dev/null 2>&1; then
  1326.       rm -f ${LIB}/$file
  1327.     fi
  1328.   fi
  1329. done
  1330.  
  1331. echo 'Removing unneeded directories:'
  1332. cd $LIB
  1333. files=`find . -type d -print | sort -r`
  1334. for file in $files; do
  1335.   rmdir $LIB/$file > /dev/null 2>&1
  1336. done
  1337.  
  1338. if $LINKS; then
  1339.   echo 'Making internal symbolic non-directory links'
  1340.   cd ${INPUT}
  1341.   files=`find . -type l -print`
  1342.   for file in $files; do
  1343.     dest=`ls -ld $file | sed -n 's/.*-> //p'`
  1344.     if expr "$dest" : '[^/].*' > /dev/null; then    
  1345.       target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"`
  1346.       if [ -f $target ]; then
  1347.         ln -s $dest ${LIB}/$file >/dev/null 2>&1
  1348.       fi
  1349.     fi
  1350.   done
  1351. fi
  1352.  
  1353. # Make sure that any include files referenced using double quotes
  1354. # exist in the fixed directory.  This comes last since otherwise
  1355. # we might end up deleting some of these files "because they don't
  1356. # need any change."
  1357. while [ -n "$required" ]; do
  1358.   newreq=
  1359.   set x $required
  1360.   shift
  1361.   while [ $# != 0 ]; do
  1362.     # $1 is the directory to copy from, $2 is the unfixed file,
  1363.     # $3 is the fixed file name.
  1364.     cd ${INPUT}
  1365.     cd $1
  1366.     if [ -r $2 ] && [ ! -r $3 ]; then
  1367.       cp $2 $3 >/dev/null 2>&1 || echo "Can't copy $2"
  1368.       chmod +w $3 2>/dev/null
  1369.       chmod a+r $3 2>/dev/null
  1370.       echo Copied $2
  1371.       for include in `egrep '^[     ]*#[     ]*include[     ]*"[^/]' $3 | sed -e 's/^[     ]*#[     ]*include[     ]*"\([^"]*\)".*$/\1/'`; do
  1372.     dir=`echo $2 | sed -e s'|/[^/]*$||'`
  1373.     dir2=`echo $3 | sed -e s'|/[^/]*$||'`
  1374.     newreq="$newreq $1 $dir/$include $dir2/$include"
  1375.       done
  1376.     fi
  1377.     shift; shift; shift
  1378.   done
  1379.   required=$newreq
  1380. done
  1381.  
  1382. echo 'Cleaning up DONE files.'
  1383. cd $LIB
  1384. find . -name DONE -exec rm -f '{}' ';'
  1385.  
  1386. exit 0
  1387.